<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of c_login_controller
 *
 * @author tonatos
 */
class c_login_controller extends c_base_controller {

    protected $module = "login";

    /**
     * Адрес кабинета пользователя
     * @var int
     */
    public $cabinet = 86;

    public $error;

    function index() {
        global $modx;
        if ($modx->getLoginUserID()) {
            $this->return_to_page();
        }

        $form = new c_form_controller();

        $form->add_varchar("username", "Логин", "", 1);
        $form->add_password("password", "Пароль", "", 1);
        $form->add_checkbox("remember", "Запомнить меня");
        $form->add_html('<p><a href="register.html">Регистрация</a> | <a href="register/fogot.html">Забыли пароль?</a></p>');

        if ($form->data_submitted()) {
            if ($form->is_validate()) {
                $data = $form->get_data();

                //Проверяем логин/пароль
                $web_user = $this->check($data['username'], $data['password']);

                //Пользователь найден
                if ($web_user!==false) {

                    //Входим
                    $this->login($web_user,$data['remember']);

                    //Переходим в кабинет
                    $this->return_to_page();

                } else {
                    $form->get_field("password")->set_error($this->error);
                }
            }
        }

        $this->form = $form;
        $this->show("login_form");
        
    }

    protected function return_to_page($return_id = null){
        global $modx;
        $url = "/";
        if (isset($_SESSION['mvc_login_callback'])){
            $url = $_SESSION['mvc_login_callback'];
            unset($_SESSION['mvc_login_callback']);
        }else{
            $url = $modx->makeUrl( $return_id!=null ? $return_id:$this->cabinet);
        }

        $modx->sendRedirect($url);
        die();
    }

    protected function check($username, $password) {
        global $modx;

        //Ищем пользователя по логину
        $web_user = new c_web_users_model();
        
        if (!$web_user->find($username)){
            $this->error = "Логин или пароль не верный";
            return false;
        }

        //загружаем данные пользователя
        $web_user->load();

        //посыылаем нафиг всю фигню типо блокировка по дням, ip и т.д.
        //проверяем только кол-во попыток входа и блокировку с активацией

        //Простая блокировка
        if ($web_user->blocked == 1) {
            $this->error = "Ваш аккаунт заблокирован";
            return false;
        }

        //Не активированный аккаунт
        if ($web_user->activated == 0) {
            $this->error = "Вы еще не активировали свой аккаунт, <a href='register/fogot_active'>выслать повторно письмо</a> с инструкциями по активации</a>";
            return false;
        }

        //Заблокирован по времени
        if ($web_user->blockeduntil > time()) {
            $this->error = "Аккаун заблокирован, он будет разлокирован ".date("d.m.Y H:s",$web_user->blockeduntil);
            return false;
        }

        //Снятие блокировки по времени
        if ($web_user->failedlogincount >= $modx->config['failed_login_attempts'] && $web_user->blockeduntil < time()) {
            $web_user->failedlogincount = 0;
            $web_user->blockeduntil = 0;
            $web_user->save();
        }

        //проверяем пароль
        if ($web_user->password!=md5($password)){
            $this->error = "Логин или пароль не верный";

            //Увеличиваем счетчик
            $web_user->failedlogincount++;
            if ($web_user->failedlogincount >= $modx->config['failed_login_attempts']) {
                $web_user->blockeduntil = time() + $modx->config['blocked_minutes'] * 60;
            }
            $web_user->save();
            return false;
        }
        return $web_user;
    }

    public function login($web_user,$remember=0){
        global $modx;
        //Сохрянем данные в базе
        $web_user->sessionid = session_id();
        $web_user->failedlogincount=0;
        $web_user->logincount++;
        $web_user->lastlogin=time();
        $web_user->thislogin=time();


        $_SESSION['webShortname'] = $web_user->username;
        $_SESSION['webFullname'] = $web_user->fullname;
        $_SESSION['webEmail'] = $web_user->email;
        $_SESSION['webValidated'] = 1;
        $_SESSION['webInternalKey'] = $web_user->id;
        $_SESSION['webValid'] = base64_encode($web_user->password);
        $_SESSION['webUser'] = base64_encode($web_user->username);
        $_SESSION['webFailedlogins'] = $web_user->failedlogins;
        $_SESSION['webLastlogin'] = $web_user->lastlogin;
        $_SESSION['webnrlogins'] = $web_user->logincount;

        //Оставил этот "некрасивыый" код
        $_SESSION['webUserGroupNames'] = ''; // reset user group names
        // get user's document groups
        $dg = '';
        $i = 0;
        $tblug = $modx->getFullTableName("web_groups");
        $tbluga = $modx->getFullTableName("webgroup_access");
        $sql = "SELECT uga.documentgroup FROM $tblug ug INNER JOIN $tbluga uga ON uga.webgroup=ug.webgroup WHERE ug.webuser =" . $web_user->id;
        $ds = $modx->db->query($sql);
        while ($row = $modx->db->getRow($ds, 'num')) {
            $dg[$i++] = $row[0];
        }
        $_SESSION['webDocgroups'] = $dg;
        if (!empty($remember)) {
            $_SESSION['modx.web.session.cookie.lifetime'] = intval($modx->config['session.cookie.lifetime']);
        } else {
            $_SESSION['modx.web.session.cookie.lifetime'] = 0;
        }

        include_once $modx->config['base_path'] . "manager/includes/log.class.inc.php";

        $log = new logHandler;
        $log->initAndWriteLog("Logged in", $_SESSION['webInternalKey'], $_SESSION['webShortname'], "58", "-", "WebLogin");

        // invoke OnWebLogin event
        $modx->invokeEvent("OnWebLogin",array("userid" => $web_user->id,"username" => $web_user->username,"userpassword" => $web_user->password,"rememberme" => $remember));

        return true;
    }

    protected function auto_login($userid,$remember=0) {
        global $modx;

        $web_user = new c_web_users_model($userid);
        if ($web_user===false){
            return false;
        }

        $this->login($web_user,$remember);
        return true;
    }

    public function logout($params){
        global $modx;
        
        $internalKey = $_SESSION['webInternalKey'];
        $username = $_SESSION['webShortname'];

        // invoke OnBeforeWebLogout event
        $modx->invokeEvent("OnBeforeWebLogout",array("userid"   => $internalKey,"username" => $username));

        unset($_SESSION['webShortname']);
        unset($_SESSION['webFullname']);
        unset($_SESSION['webEmail']);
        unset($_SESSION['webValidated']);
        unset($_SESSION['webInternalKey']);
        unset($_SESSION['webValid']);
        unset($_SESSION['webUser']);
        unset($_SESSION['webFailedlogins']);
        unset($_SESSION['webLastlogin']);
        unset($_SESSION['webnrlogins']);
        unset($_SESSION['webUsrConfigSet']);
        unset($_SESSION['webUserGroupNames']);
        unset($_SESSION['webDocgroups']);

        // invoke OnWebLogout event
        $modx->invokeEvent("OnWebLogout",array("userid"=> $internalKey,"username"=> $username));

        //Переход на страницу заданную в параметрах или через сесию
        $this->return_to_page(isset($params[2])?$params[2]:0);
       
    }

    public function login_form(){
        global $modx;
        $user_id = $modx->getLoginUserID();

        //Автоматический возврат на страницу
        $_SESSION['mvc_login_callback'] = $_SERVER['REQUEST_URI'];
        
        if (empty($user_id)){            
            $this->show("login_form_block");
        }else{
            $this->user = new c_web_users_model($user_id);
            $this->show("workplace_form_block");
        }
    }
}
?>
